package com.liukunup.reader;

import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 文本文件 XXX读取 基类
 * @author Liu Kun
 * @date 2021-04-03 20:26:05
 **/
@Slf4j
public abstract class BaseTextReader implements Iterator<Object[]> {
    /**
     * 游标
     */
    protected Integer cursor = 0;
    /**
     * 行数据列表
     * 注意: 包括首行数据
     */
    protected List<String> lineList = null;
    /**
     * 有效行数
     */
    protected Integer lineCount = 0;
    /**
     * 首行内容
     */
    protected String firstLine = null;
    /**
     * 行首注释符
     * 以 # 开头的行将被跳过
     */
    protected String annotationSymbol = "#";

    public BaseTextReader(String filename) {
        log.debug("load text file: {}", filename);
        // 判断文件是否合法
        File txtFile = new File(filename);
        if (!txtFile.exists() || !txtFile.isFile() || !txtFile.canRead()) {
            return;
        }
        // 初始化
        if (null == lineList) {
            lineList = new ArrayList<String>();
        } else {
            lineList.clear();
        }
        lineCount = 0;
        cursor = 0;
        firstLine = "";
        // 读取文件
        try {
            // 获取文件读取对象
            FileInputStream fis = new FileInputStream(txtFile);
            InputStreamReader isr = new InputStreamReader(fis);
            BufferedReader br = new BufferedReader(isr);
            // 逐行读取
            String line = null;
            while((line = br.readLine()) != null){
                // 如遇行首注释符,则跳过此行
                if (line.startsWith(annotationSymbol)) {
                    continue;
                }
                // 如果是第一行有效行,则需存储用于后续获取标题等
                if (0 == lineCount) {
                    firstLine = line;
                }
                // 记录有效行内容及其行数
                lineList.add(line);
                lineCount += 1;
            }
            // 关闭读取
            br.close();
            isr.close();
            fis.close();
        } catch (IOException e) {
            log.error(e.getMessage());
        }
    }


    @Override
    public boolean hasNext() {
        // 判断是否数据已取完
        return (0 != lineCount) && (cursor < lineCount);
    }

    @Override
    public Object[] next() {
        // 存储返回数据
        Object[] objects = new Object[1];
        // 如果未读取到有效行则直接返回
        if (null == this.lineList) {
            return objects;
        }
        // 根据游标取数据
        objects[0] = lineList.get(cursor);
        // 移动游标
        cursor += 1;
        // 返回数据
        return objects;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException("remove operation unsupported!");
    }
}
